//拦截导弹
#include <iostream>
#include<algorithm>

using namespace std;
const int MAXN=1000;
int n;
int high[MAXN+1];
int l1,l2;
int d1[MAXN+1],d2[MAXN+1];//d1[i]表示长度为（i+1)的子序列最小元素，d1中元素从大到小排列
                            //d2[i]表示第(i+1)个子序列的最小元素，d2中元素大小到大排列

int main(){
    n=1;
    while(cin>>high[n]) n++;
    n--;

    l1=1;
    d1[0]=high[1];//长度为1的子序列的最小值
    
    l2=1;
    d2[0]=high[1];//第1个子序列的最小值

    for(int i=2;i<=n;i++){
        if (high[i]<=d1[l1-1]) d1[l1++]=high[i];//当high[i]小于长度为l1的子序列最小元素，则可以形成长度为l1+1的子序列
        else {              //否则无法形成更长的子序列，则去前面找到第一个最小元素小于high[i]的子序列，替换它的最小元素值,
                            //这样同长度子序列的最小元素会变大，以便序列后面可以接更多的元素。
            int k=upper_bound(d1,d1+l1,high[i],greater<int>())-d1;
            d1[k]=high[i];
        }

        if (high[i]>d2[l2-1]) d2[l2++]=high[i];//当high[i]大于第li个子序列的最小元素时，则需增加新的子序列
        else {                          //否则无需增加新序列，则去前面找到第一个最小元素大于或等high[i]的子序列，替换它的最小元素值
            int k=lower_bound(d2,d2+l2,high[i])-d2;
            d2[k]=high[i];
        }
    }
    
    //输出
    cout<<l1<<endl<<l2;
}